package com.apps.java.javanote02;

import java.io.File;
import java.io.IOException;

public class _23IO流_File {
    /**
     * File
     *
     * 	一、概述
     * 		File：它是文件和目录路径名的抽象表示
     * 		1.文件和目录是可以通过File封装成对象的
     * 		2.对于File而言，其封装的并不是一个真正存在的文件，仅仅是一个路径名而已。它可以是存在的，也可以是不存在的。
     * 		      将来是要通过具体的操作把这个路径的内容转换为具体存在的
     *
     * 	二、构造方法
     * 		方法名								说明
     * 		File(String pathname)				通过将给定的路径名字符串转换为抽象路径名来创建新的File实例
     * 		File(String parent,String child)	从父路径名字符串和子路径名字符串创建新的File实例
     * 		File(File parent,String child)		从父抽象路径名和子路径名字符串创建新的File实例
     *
     * 	三、File类的创建功能
     * 		方法名								说明
     * 		public boolean createNewFile()		当具有该名称的文件不存在时，创建一个由该抽象路径名命名的新空文件
     * 		public boolean mkdir()				创建由此抽象路径名命名的目录
     * 		public boolean mkdirs()				创建由此抽象路径名命名的目录，包括任何必需但不存在的父目录
     *
     * 	四、File类判断和获取功能
     * 		方法名
     * 		public boolean isDirectory()		测试此抽象路径名表示的File是否为目录
     * 		public boolean isFile()				测试此抽象路径名表示的File是否为文件
     * 		public boolean exists()				测试此抽象路径名表示的File是否存在
     * 		public String getAbsolPath()		返回此抽象路径名的绝对路径名字符串
     * 		public String getPath()				将此抽象路径名转换为路径名字符串
     * 		public String getName()				返回由此抽象路径名表示的文件或目录的名称
     * 		public String[] list()				返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
     * 		public File[] listFiles()			返回此抽象路径名表示的目录中的文件和目录的File对象数组
     *
     * 	五、File类删除功能
     * 		方法名						说明
     * 		public boolean delete()		删除由此抽象路径名表示的文件或目录
     * 		如果一个目录中有内容（目录、文件），不能直接删除，应该先删除目录中的内容，最后才能删除目录
     *
     * 	绝对路径和相对路径的区别
     * 		1.绝对路径：完整的路径名，不需要任何其他信息就可以定位它所表示的文件。例如：E\\java\\IO\\Io流练习.txt
     * 		2.相对路径：必须使用取自其他路径名的信息进行解释，例如：IO\\Io流练习.txt
     *
     * 	六、递归
     * 		概述：以编程的角度来看，递归指的是方法定义中调用方法本身的现象
     * 		1.递归解决问题的思路：
     * 			把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
     * 			递归策略只需少量的程序就可以描述出解题过程中的多次重复计算
     * 		2.递归解决问题要找到两个内容
     * 			（1）递归出口：否则会出现内存溢出
     * 			（2）递归规则：与原问题相似的规模较小的问题
     *
     *
     *
     */

    public static void main(String[] args) throws IOException {

        //File的构造方法
        //1.File(String pathname)：通过将给定的路径名字符串转换为抽象路径名来创建新的File实例
        File f1 = new File("E:\\Java\\io\\io流练习.txt");
        System.out.println(f1);

        //2.File(String parent,String child):从父路径名字符串和子路径名字符串创建新的File实例
        File f2 = new File("E:\\Java\\io", "io流练习.txt");
        System.out.println(f2);

        //3.File(File parent,String child):从父抽象路径名和子路径名字符串创建新的File实例
        File pf3 = new File("E:\\Java\\io");
        File f3 = new File(pf3, "io流练习.txt");
        System.out.println(f3);

        //File的创建方法
        //1.public boolean createNewFile():当具有该名称的文件不存在时，创建一个由该抽象路径名命名的新空文件
        File f4 = new File("E:\\Java\\io\\io流练习2.txt");
        System.out.println("该文件是否存在：" + f4.createNewFile());
        //结论：如果文件不存在 ，就创建文件，并返回true；如果文件存在，就不创建文件，并返回false

        //2.public boolean mkdir():创建由此抽象路径名命名的目录
        File f5 = new File("E:\\Java\\io2");
        System.out.println("该目录是否存在，存在创建目录：" + f5.mkdir());
        //结论：如果目录不存在 ，就创建目录，并返回true；如果目录存在，就不创建目录，并返回false
        File f6 = new File("E:\\Java2\\io2");
        System.out.println("该目录是否存在，存在创建目录：" + f6.mkdir());
        //结论：如果目录不存在但是父目录也不存在 ，也不创建目录，并返回false

        //3.public boolean mkdirs()：创建由此抽象路径名命名的目录，包括任何必需但不存在的父目录
        File f7 = new File("E:\\Java\\io3\\io练习");
        System.out.println("该目录是否存在，存在创建包含父目录的目录：" + f7.mkdirs());
        //结论：如果目录不存在（包括父目录也不存在） ，就创建目录，并返回true；如果目录存在，就不创建目录，并返回false

        //File类判断和获取功能
        //1.public boolean isDirectory()：测试此抽象路径名表示的File是否为目录
        File f8 = new File("E:\\Java\\io");
        System.out.println("此抽象路径名表示的File是否为目录:" + f8.isDirectory());

        //2.public boolean isFile()：测试此抽象路径名表示的File是否为文件
        File f9 = new File("E:\\Java\\io\\io流练习.txt");
        System.out.println("测试此抽象路径名表示的File是否为文件:" + f9.isFile());

        //3.public boolean exists():测试此抽象路径名表示的File是否存在
        System.out.println("测试此抽象路径名表示的File是否存在:" + f9.exists());

        //4.public String getAbsolPath():返回此抽象路径名的绝对路径名字符串
        System.out.println("此抽象路径名的绝对路径名字符串:" + f9.getAbsolutePath());

        //5.public String getPath()	将此抽象路径名转换为路径名字符串
        System.out.println("将此抽象路径名转换为路径名字符串:" + f9.getPath());

        //6.public String getName() 返回由此抽象路径名表示的文件或目录的名称
        System.out.println("返回由此抽象路径名表示的文件或目录的名称:" + f9.getName());

        //7.public String[] list() 返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
        File f10 = new File("E:\\Java\\io");
        String[] list = f10.list();
        System.out.println("返回此抽象路径名表示的目录中的文件和目录的名称字符串数组：");
        for(String s : list){
            System.out.println("  " + s);
        }

        //8.public File[] listFiles() 返回此抽象路径名表示的目录中的文件和目录的File对象数组
        File[] listFiles = f10.listFiles();
        System.out.println("返回此抽象路径名表示的目录中的文件和目录的File对象数组:");
        for(File s : listFiles){
            //System.out.println("  " + s);
            //System.out.println(" " + s.getName());//返回由此抽象路径名表示的文件或目录的名称
            if(s.isDirectory()){//判断是否是目录
                System.out.println(" " + s.getName());
            }
        }

        //File类删除功能
        //public boolean delete()：删除由此抽象路径名表示的文件或目录
        File f11 = new File("E:\\Java\\io\\io流练习2.txt");
        System.out.println("删除由此抽象路径名表示的文件:" + f11.delete());
        //删目录
        File f12 = new File("E:\\Java\\io");
        System.out.println("删除由此抽象路径名表示的目录:" + f11.delete());
        //结论：如果当前目录非空，则不能被删除

        //File递归

    }
}
